package org.mbcorp.sar.service.impl;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;

import org.apache.commons.io.IOUtils;
import org.mbcorp.sar.dao.ArchivoDAO;
import org.mbcorp.sar.model.Archivo;
import org.mbcorp.sar.service.ArchivoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
public class ArchivoServiceImpl implements ArchivoService {

	@Autowired
    private MessageSource message;
	
	private static final Logger LOGGER = LoggerFactory
			.getLogger(ArchivoServiceImpl.class);

	@Resource
	private ArchivoDAO archivoDAO;

	@Transactional
	@Override
	public Archivo grabar(Archivo created) {
		LOGGER.debug("Creando nuevo archivo con informacion: " + created);

		return archivoDAO.save(created);
	}

	@Override
	@Transactional
	public Archivo eliminar(Integer archivoId)
			throws RuntimeException {
		LOGGER.debug("Eliminando archivo con id: " +  archivoId);

		Archivo eliminado =  archivoDAO.findOne(archivoId);

		if (eliminado == null) {
			LOGGER.debug("No se encontro archivo con id: " + archivoId);
			throw new RuntimeException();
		}

		archivoDAO.delete(eliminado);
		return eliminado;
	}

	@Transactional(readOnly = true)
	@Override
	public List<Archivo> buscarTodos() {
		LOGGER.debug("Buscando todos las archivos");
		return archivoDAO.findAll();
	}

	@Transactional(readOnly = true)
	@Override
	public Archivo buscarPorId(Integer id) {
		LOGGER.debug("Buscando archivo con id: " + id);
		return archivoDAO.findOne(id);
	}

	@Transactional
	@Override
	public Archivo actualizar(Archivo actualizado)
			throws RuntimeException {
		LOGGER.debug("Actualizando archivo con informacion: " + actualizado);

		Archivo archivo = archivoDAO.findOne(actualizado.getId());

		if (archivo == null) {
			LOGGER.debug("No se encontro archivo con id: "
					+ actualizado.getId());
			throw new RuntimeException();
		}

		return archivo;
	}
	
	public Archivo generarArchivo(MultipartFile archivoRaw){
		String fileName = archivoRaw.getOriginalFilename();	
		String ruta = message.getMessage("archivo.ruta", null, Locale.getDefault());
		Archivo archivo = new Archivo();
		archivo.setFechaRegistro(new Date());
		archivo.setFlagEliminado(false);
		archivo.setNombre(fileName);
		archivo = archivoDAO.save(archivo);
		ruta = ruta + archivo.getId() + fileName;
		archivo.setRuta(ruta);
		OutputStream outputStream = null;
		try {  
			   InputStream inputStream = archivoRaw.getInputStream();
			  
			   File newFile = new File(ruta);  
			   if (!newFile.exists()) {
			    newFile.createNewFile();  
			   }  
			   outputStream = new FileOutputStream(newFile);  
			   int read = 0;  
			   byte[] bytes = new byte[2048];
			  
			   while ((read = inputStream.read(bytes)) != -1) {
			    outputStream.write(bytes, 0, read);
			   }  
			 } catch (IOException e) {  
			   // TODO Auto-generated catch block  
			  e.printStackTrace();  
			} finally {
				 IOUtils.closeQuietly(outputStream);
			}
		return grabar(archivo);
	}

}
